package com.springboot.test.service;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.springboot.test.common.enums.StaticKey;
import com.springboot.test.common.utils.JsonUtils;
import com.springboot.test.common.utils.RedisUtils;
import com.springboot.test.entity.UserEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.UUID;

@Service
@Slf4j
public class RedisService {
    @Resource
    private RedisUtils redisUtils;

    /**
     * 保存key
     * @param key
     * @param value
     */
    public void set(String key,String value){
        redisUtils.set(key,value);
        return;
    }

    /**
     * 通过key获取文本，可能为json串或者字符串
     * @param key
     * @return
     */
    public String get(String key){
        return redisUtils.get(key);
    }

    public void remove(String key){
        redisUtils.remove(key);
        return;
    }

    public void removeToken(String token){
        remove(StaticKey.TOKEN_KEY+token);
        return;
    }


    /**
     * 保存定时key，在规定时间后自动删除
     * @param key
     * @param value
     * @param time
     */
    public void expireMin(String key, String value,Long time){
        redisUtils.expireMin(key,value,time);
        return;
    }

    /**
     * 生成token保存进redis，token为key，用户信息的json为value
     * @param entity
     * @return
     */
    public String saveUserInfo(UserEntity entity){
        String token = UUID.randomUUID().toString();
        return saveUserInfo(token,entity);
    }

    public String saveUserInfo(String token, UserEntity entity){
        expireMin(StaticKey.TOKEN_KEY + token, JsonUtils.objectToJson(entity),StaticKey.TOKEN_TIME);
        log.info(String.format("保存用户信息，token:%s,userInfo:%s",token,JsonUtils.objectToJson(entity)));
        return token;
    }

    /**
     * 通过token获取用户信息，没有返回null
     * @param token
     * @return
     */
    public UserEntity getUserInfo(String token){
        if (StringUtils.isNotBlank(redisUtils.get(StaticKey.TOKEN_KEY + token))) {
            String json = redisUtils.get(StaticKey.TOKEN_KEY + token);
            UserEntity userEntity = JsonUtils.jsonToObject(json, UserEntity.class);
            //重刷token
            saveUserInfo(token, userEntity);
            log.info(String.format("刷新缓存，token:%s",token));
            return userEntity;
        }
        return null;
    }



}
